Ключевые обновления:
Поддержка C# 14 Preview: Включает nameof для необобщенных типов, первоклассные преобразования Span<T> и упрощенные параметры лямбда-выражений с модификаторами.
Новые инспекции кода: Обнаружение потенциальных проблем, таких как небезопасное использование CancellationToken, неточные чтения потоков, избыточный код в условных операторах и ненужные вызовы .ToString() для перечислений.
Улучшения рефакторинга и форматирования: Возможность переключения <ImplicitUsings> во всем проекте, обновленный рефакторинг параметров с поддержкой кортежей, записей и асинхронных методов, а также новые опции форматирования, включая "chop formatting" и улучшенную обертку комментариев.
Производительность: Новая система интернирования строк снижает использование памяти вдвое, а поддержка Blazor и Razor переработана для более быстрой и стабильной работы, особенно в проектах ASP.NET с большим количеством компонентов.
Поддержка C++ и разработка игр: Включает рефакторинг Inline Macro, поддержку новых расширений GNU, уменьшенное использование памяти для крупных проектов на Unreal Engine и обновленный Clang-Tidy с улучшенной поддержкой GoogleTest.
Интеграция с Unity: Новый плагин для ReSharper предоставляет автодополнение для функций событий Unity и файлов ShaderLab, улучшенную обработку файлов .meta и распознавание неявных использований в префабах и сценах.
Расширение Qodana Team Code Quality: Позволяет интегрировать проекты Qodana Cloud или самохостингованные проекты Qodana в Visual Studio для выявления проблем с кодом, ошибок и уязвимостей непосредственно в IDE.
Для более подробной информации и загрузки релиз-кандидата посетите официальный блог JetBrains.
📌 Читать
Please open Telegram to view this post
VIEW IN TELEGRAM
Что выведет на экран этот код?
Anonymous Quiz
31%
IFoo 1, IBar 2
8%
IFoo 1, MyClass 2
16%
MyClass 1, MyClass 2
6%
MyClass 1, IBar 2
17%
Возникнет ошибка компиляции
4%
Возникнет ошибка времени выполнения
18%
🥒
🚀 .NET 10 Preview 3 уже доступен!
Новая версия приносит мощное обновление для C# — Extension Members:
💡 Теперь можно добавлять в static class расширения не только методов, но и:
▪ 🔹 Статические методы
▪ 🔹 Инстанс-свойства
▪ 🔹 Статические свойства
📦 Это значит, что вы можете "расширять" поведение типов не только логикой, но и дополнительными данными и даже стейтфул-логикой (через свойства).
И всё это — без изменения исходного класса.
🔗 Подробнее:
https://github.com/dotnet/core/blob/main/release-notes/10.0/preview/preview3/csharp.md#extension-members
#dotnet #csharp #dotnet10 #devtools #preview
@csharp_ci
Новая версия приносит мощное обновление для C# — Extension Members:
💡 Теперь можно добавлять в static class расширения не только методов, но и:
▪ 🔹 Статические методы
▪ 🔹 Инстанс-свойства
▪ 🔹 Статические свойства
📦 Это значит, что вы можете "расширять" поведение типов не только логикой, но и дополнительными данными и даже стейтфул-логикой (через свойства).
И всё это — без изменения исходного класса.
🔗 Подробнее:
https://github.com/dotnet/core/blob/main/release-notes/10.0/preview/preview3/csharp.md#extension-members
#dotnet #csharp #dotnet10 #devtools #preview
@csharp_ci
🔧 Задача на C# для внимательных разработчиков
Что выведет следующий код?
Варианты ответа:
A)
B)
C)
D)Ошибка компиляции
---
✅ Правильный ответ: B
Почему:
Лямбда-функции захватывают переменную по ссылке, а не её значение на каждой итерации. После завершения цикла , и все замыкания ссылаются на одно и то же . Это классическая ловушка замыканий в C#.
@csharp_ci
Что выведет следующий код?
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var actions = new List<Action>();
for (int i = 0; i < 3; i++)
{
actions.Add(() => Console.WriteLine(i));
}
foreach (var action in actions)
action();
}
}
Варианты ответа:
A)
1
2
B)
3
3
C)
0
0
D)Ошибка компиляции
---
✅ Правильный ответ:
Почему:
Лямбда-функции захватывают переменную
i
i == 3
i
@csharp_ci
🚀 Релиз: SQL Formatting Preview в T-SQL Analyzer CLI
В последнем обновлении инструмента T-SQL Analyzer CLI от ErikEJ появилась функция предварительного просмотра форматирования SQL-кода.
✨ Основные возможности:
Автоматическое форматирование T-SQL скриптов с использованием встроенных правил.
Интеграция с анализатором кода, позволяющая одновременно проверять и форматировать скрипты.
Поддержка командной строки, что удобно для автоматизации процессов и интеграции в CI/CD пайплайны.
🔧 Пример использования:
Эта команда проанализирует и отформатирует указанный SQL-скрипт согласно установленным правилам.
📌 Подробнее о новых возможностях и инструкциях по установке читайте в официальной документации.
#sqlserver #tsql #dotnet #cli #devtools
https://github.com/ErikEJ/SqlServer.Rules/tree/master/tools/SqlAnalyzerCli#sql-formatting-preview
@csharp_ci
В последнем обновлении инструмента T-SQL Analyzer CLI от ErikEJ появилась функция предварительного просмотра форматирования SQL-кода.
✨ Основные возможности:
Автоматическое форматирование T-SQL скриптов с использованием встроенных правил.
Интеграция с анализатором кода, позволяющая одновременно проверять и форматировать скрипты.
Поддержка командной строки, что удобно для автоматизации процессов и интеграции в CI/CD пайплайны.
🔧 Пример использования:
tsqlanalyze -i "C:\scripts\proc.sql" --format
Эта команда проанализирует и отформатирует указанный SQL-скрипт согласно установленным правилам.
📌 Подробнее о новых возможностях и инструкциях по установке читайте в официальной документации.
#sqlserver #tsql #dotnet #cli #devtools
https://github.com/ErikEJ/SqlServer.Rules/tree/master/tools/SqlAnalyzerCli#sql-formatting-preview
@csharp_ci
🖼 ImageSharp — мощная библиотека для обработки изображений на C# (.NET)
✅ Поддержка форматов PNG, JPEG, GIF, BMP и др.
✂️ Масштабирование и обрезка изображений
🎨 Фильтры и визуальные эффекты
🌀 Работа с анимированными GIF
🚀 Высокая производительность без лишних зависимостей
📌 Полностью написана на C# и легко интегрируется в любые .NET-проекты.
Идеальный инструмент для тех, кто хочет быстро и качественно работать с изображениями.
🔗 GitHub
@csharp_ci
✅ Поддержка форматов PNG, JPEG, GIF, BMP и др.
✂️ Масштабирование и обрезка изображений
🎨 Фильтры и визуальные эффекты
🌀 Работа с анимированными GIF
🚀 Высокая производительность без лишних зависимостей
📌 Полностью написана на C# и легко интегрируется в любые .NET-проекты.
Идеальный инструмент для тех, кто хочет быстро и качественно работать с изображениями.
🔗 GitHub
@csharp_ci
💡 Задача: Загадочный Кэш
У тебя есть метод, который возвращает последовательность чисел, вычисляемую с задержкой (например, чтение из удалённого ресурса):
Теперь тебе нужно реализовать метод ProcessData(), который:
Вызывает GetSlowData() один раз.
Проходит по данным дважды: сначала фильтрует только чётные, потом считает сумму всех.
Не должен повторно "запрашивать" данные (то есть Fetching data... должен выводиться один раз).
Не должен использовать ToList(), ToArray() или другие методы, загружающие всё в память явно.
🧠 Вопрос с подвохом: Как реализовать ProcessData()?
Напиши реализацию:
🔎 Подсказка
Если ты просто используешь IEnumerable<int> и дважды к нему обращаешься — будет два запроса. Но есть один способ реализовать ленивое кэширование, не загружая всё в память сразу и не повторяя yield return.
Решение:
Если ты просто напишешь вот так:
```csharp
var data = GetSlowData();
var evens = data.Where(x => x % 2 == 0);
var sum = data.Sum();```
то GetSlowData() будет вызван дважды, потому что IEnumerable ленивый — и при каждом новом foreach начинается всё заново. Это видно по двойному выводу Fetching data....
🧠 Цель: пройтись по данным один раз, кэшируя элементы "на лету", и позволить другим перечислениям работать без повторного получения.
✅ Решение: Используем ленивый кеш — с помощью кастомного итератора
```csharp
public static void ProcessData()
{
var cached = new MemoizedEnumerable<int>(GetSlowData());
var evens = cached.Where(x => x % 2 == 0);
var sum = cached.Sum();
Console.WriteLine("Even numbers: " + string.Join(", ", evens));
Console.WriteLine("Sum: " + sum);
}```
А вот реализация ленивого кеширующего MemoizedEnumerable<T>:
```csharp
public class MemoizedEnumerable<T> : IEnumerable<T>
{
private readonly IEnumerator<T> _source;
private readonly List<T> _cache = new();
private bool _sourceFinished = false;
public MemoizedEnumerable(IEnumerable<T> source)
{
_source = source.GetEnumerator();
}
public IEnumerator<T> GetEnumerator()
{
int index = 0;
while (true)
{
if (index < _cache.Count)
{
yield return _cache[index];
}
else
{
if (_sourceFinished || !_source.MoveNext())
{
_sourceFinished = true;
yield break;
}
_cache.Add(_source.Current);
yield return _source.Current;
}
index++;
}
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}```
🧪 Что происходит
MemoizedEnumerable запоминает каждый элемент один раз при первом проходе.
Следующие проходы используют кэш.
Fetching data... будет вызван только один раз.
💥 Подвох
Большинство подумает, что IEnumerable можно безопасно переиспользовать без сайд-эффектов. Но не тут-то было: без кэширования yield выполнится дважды. Многие Middle+ разработчики ошибаются именно тут.
У тебя есть метод, который возвращает последовательность чисел, вычисляемую с задержкой (например, чтение из удалённого ресурса):
public static IEnumerable<int> GetSlowData()
{
Console.WriteLine("Fetching data...");
yield return 1;
Thread.Sleep(1000);
yield return 2;
Thread.Sleep(1000);
yield return 3;
}
Теперь тебе нужно реализовать метод ProcessData(), который:
Вызывает GetSlowData() один раз.
Проходит по данным дважды: сначала фильтрует только чётные, потом считает сумму всех.
Не должен повторно "запрашивать" данные (то есть Fetching data... должен выводиться один раз).
Не должен использовать ToList(), ToArray() или другие методы, загружающие всё в память явно.
🧠 Вопрос с подвохом: Как реализовать ProcessData()?
Напиши реализацию:
public static void ProcessData()
{
// твой код здесь
}
🔎 Подсказка
Решение:
```csharp
var data = GetSlowData();
var evens = data.Where(x => x % 2 == 0);
var sum = data.Sum();```
то GetSlowData() будет вызван дважды, потому что IEnumerable ленивый — и при каждом новом foreach начинается всё заново. Это видно по двойному выводу Fetching data....
🧠 Цель: пройтись по данным один раз, кэшируя элементы "на лету", и позволить другим перечислениям работать без повторного получения.
✅ Решение: Используем ленивый кеш — с помощью кастомного итератора
```csharp
public static void ProcessData()
{
var cached = new MemoizedEnumerable<int>(GetSlowData());
var evens = cached.Where(x => x % 2 == 0);
var sum = cached.Sum();
Console.WriteLine("Even numbers: " + string.Join(", ", evens));
Console.WriteLine("Sum: " + sum);
}```
А вот реализация ленивого кеширующего MemoizedEnumerable<T>:
```csharp
public class MemoizedEnumerable<T> : IEnumerable<T>
{
private readonly IEnumerator<T> _source;
private readonly List<T> _cache = new();
private bool _sourceFinished = false;
public MemoizedEnumerable(IEnumerable<T> source)
{
_source = source.GetEnumerator();
}
public IEnumerator<T> GetEnumerator()
{
int index = 0;
while (true)
{
if (index < _cache.Count)
{
yield return _cache[index];
}
else
{
if (_sourceFinished || !_source.MoveNext())
{
_sourceFinished = true;
yield break;
}
_cache.Add(_source.Current);
yield return _source.Current;
}
index++;
}
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}```
🧪 Что происходит
MemoizedEnumerable запоминает каждый элемент один раз при первом проходе.
Следующие проходы используют кэш.
Fetching data... будет вызван только один раз.
💥 Подвох
Большинство подумает, что IEnumerable можно безопасно переиспользовать без сайд-эффектов. Но не тут-то было: без кэширования yield выполнится дважды. Многие Middle+ разработчики ошибаются именно тут.
❓ Что выведет следующий код на C#?
🔢 Варианты ответа:
A)
B)
C)
D)
✅ Правильный ответ:C
💡 Почему?
- и — boxed значения типа , то есть ссылки на два разных объекта в куче.
- сравнивает ссылки, а не значения → .
- вызывает метод для , который сравнивает значения → .
📌 Подвох — в различии и при использовании упакованных типов.
@csharp_ci
using System;
class Program {
static void Main() {
int a = 1000;
int b = 1000;
object x = a;
object y = b;
Console.WriteLine(x == y); // #1
Console.WriteLine(x.Equals(y)); // #2
}
}
🔢 Варианты ответа:
A)
True
B)
False
C)
True
D)
False
✅ Правильный ответ:
💡 Почему?
-
x
y
int
-
x == y
False
-
x.Equals(y)
Equals
int
True
📌 Подвох — в различии
==
.Equals()
@csharp_ci
Что выведет на экран этот код?
Anonymous Poll
26%
System.String
24%
System.Int32
10%
System.Object
23%
Возникнет ошибка компиляции
17%
🥒
@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
Реальные проекты и нетворкинг с профи: Летняя школа бэкенд‑разработки Яндекса открыла набор
Начинающие бэкендеры, есть планы на лето? Если уже умеете писать читаемый код в Python, Java или C++ и разбираетесь в алгоритмах, Летняя школа бэкенда Яндекса — ваш шанс прокачаться в разработке высоконагруженных сервисов. Вы получите уникальный опыт, работая вместе с ведущими специалистами компании.
Как проходит обучение:
— со 2 июня по 27 июля — онлайн-лекции, семинары и практические задания
— с 28 июля по 24 августа — разработка реальных проектов офлайн или онлайн
Вас ждут:
— работа в фулстек-командах в коворкингах Яндекса
— лекции от специалистов компании в летнем лектории
— возможность стать частью команды и получить офер: больше половины выпускников становятся стажерами или сотрудниками компании
Школа бесплатная, но нужно пройти отбор. Отправляй заявку до 27 апреля!
Начинающие бэкендеры, есть планы на лето? Если уже умеете писать читаемый код в Python, Java или C++ и разбираетесь в алгоритмах, Летняя школа бэкенда Яндекса — ваш шанс прокачаться в разработке высоконагруженных сервисов. Вы получите уникальный опыт, работая вместе с ведущими специалистами компании.
Как проходит обучение:
— со 2 июня по 27 июля — онлайн-лекции, семинары и практические задания
— с 28 июля по 24 августа — разработка реальных проектов офлайн или онлайн
Вас ждут:
— работа в фулстек-командах в коворкингах Яндекса
— лекции от специалистов компании в летнем лектории
— возможность стать частью команды и получить офер: больше половины выпускников становятся стажерами или сотрудниками компании
Школа бесплатная, но нужно пройти отбор. Отправляй заявку до 27 апреля!
@csharp_ci
Please open Telegram to view this post
VIEW IN TELEGRAM
Что выведет на экран этот код?
Anonymous Quiz
36%
derivedFoo, baseFoo, Base, Derived
19%
derivedFoo, Derived, baseFoo, Base
15%
Derived, derivedFoo, Base, baseFoo
9%
Derived, Base, derivedFoo, baseFoo
21%
🥒
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var funcs = new List<Func<int>>();
// Первая группа лямбд
for (int i = 0; i < 4; i++)
{
funcs.Add(() => i * i);
}
Console.Write("Squares: ");
foreach (var f in funcs)
Console.Write(f() + " ");
Console.WriteLine();
// Вторая группа лямбд с копией переменной
funcs.Clear();
for (int i = 0; i < 4; i++)
{
int j = i;
funcs.Add(() => j * j);
}
Console.Write("SquaresWithCopy: ");
foreach (var f in funcs)
Console.Write(f() + " ");
}
}
Ответ:
SquaresWithCopy: 0 1 4 9
Объяснение
Первая группа лямбд
Лямбды захватывают переменную i по ссылке. К моменту, когда мы их вызываем в foreach, цикл уже завершился, поэтому i == 4. Каждая лямбда вычисляет 4 * 4 → 16.
Вторая группа лямбд
Внутри цикла для каждого значения i создаётся новая локальная переменная j, и лямбда захватывает именно её. При первой итерации j = 0, при второй j = 1 и т. д. Поэтому j * j даёт 0, 1, 4, 9 соответственно.
Такой приём (захват локальной копии переменной) позволяет избежать «одинообразного» результата и сохранить значение каждой итерации.
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡️Легкий способ получать свежие обновления и следить за трендами в разработке на вашем языке. Находите свой стек и подписывайтесь:
Python: www.tg-me.com/pythonl
Linux: www.tg-me.com/linuxacademiya
Собеседования DS: www.tg-me.com/machinelearning_interview
Нерйросети www.tg-me.com/ai_machinelearning_big_data
C++ www.tg-me.com/cpluspluc
Docker: www.tg-me.com/DevopsDocker
Хакинг: www.tg-me.com/linuxkalii
Devops: www.tg-me.com/DevOPSitsec
Data Science: www.tg-me.com/data_analysis_ml
Javascript: www.tg-me.com/javascriptv
C#: www.tg-me.com/C C Sharp programming/com.csharp_ci
Java: www.tg-me.com/javatg
Базы данных: www.tg-me.com/sqlhub
Python собеседования: www.tg-me.com/python_job_interview
Мобильная разработка: www.tg-me.com/mobdevelop
Golang: www.tg-me.com/Golang_google
React: www.tg-me.com/react_tg
Rust: www.tg-me.com/rust_code
ИИ: www.tg-me.com/vistehno
PHP: www.tg-me.com/phpshka
Android: www.tg-me.com/android_its
Frontend: www.tg-me.com/front
Big Data: www.tg-me.com/bigdatai
МАТЕМАТИКА: www.tg-me.com/data_math
Kubernets: www.tg-me.com/kubernetc
Разработка игр: https://www.tg-me.com/gamedev
Haskell: www.tg-me.com/haskell_tg
Физика: www.tg-me.com/fizmat
💼 Папка с вакансиями: www.tg-me.com/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: www.tg-me.com/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: www.tg-me.com/addlist/eEPya-HF6mkxMGIy
Папка ML: https://www.tg-me.com/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://www.tg-me.com/addlist/mzMMG3RPZhY2M2Iy
😆ИТ-Мемы: www.tg-me.com/memes_prog
🇬🇧Английский: www.tg-me.com/english_forprogrammers
🧠ИИ: www.tg-me.com/vistehno
🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
📕Ит-книги бесплатно: https://www.tg-me.com/addlist/BkskQciUW_FhNjEy
Python: www.tg-me.com/pythonl
Linux: www.tg-me.com/linuxacademiya
Собеседования DS: www.tg-me.com/machinelearning_interview
Нерйросети www.tg-me.com/ai_machinelearning_big_data
C++ www.tg-me.com/cpluspluc
Docker: www.tg-me.com/DevopsDocker
Хакинг: www.tg-me.com/linuxkalii
Devops: www.tg-me.com/DevOPSitsec
Data Science: www.tg-me.com/data_analysis_ml
Javascript: www.tg-me.com/javascriptv
C#: www.tg-me.com/C C Sharp programming/com.csharp_ci
Java: www.tg-me.com/javatg
Базы данных: www.tg-me.com/sqlhub
Python собеседования: www.tg-me.com/python_job_interview
Мобильная разработка: www.tg-me.com/mobdevelop
Golang: www.tg-me.com/Golang_google
React: www.tg-me.com/react_tg
Rust: www.tg-me.com/rust_code
ИИ: www.tg-me.com/vistehno
PHP: www.tg-me.com/phpshka
Android: www.tg-me.com/android_its
Frontend: www.tg-me.com/front
Big Data: www.tg-me.com/bigdatai
МАТЕМАТИКА: www.tg-me.com/data_math
Kubernets: www.tg-me.com/kubernetc
Разработка игр: https://www.tg-me.com/gamedev
Haskell: www.tg-me.com/haskell_tg
Физика: www.tg-me.com/fizmat
💼 Папка с вакансиями: www.tg-me.com/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: www.tg-me.com/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: www.tg-me.com/addlist/eEPya-HF6mkxMGIy
Папка ML: https://www.tg-me.com/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://www.tg-me.com/addlist/mzMMG3RPZhY2M2Iy
😆ИТ-Мемы: www.tg-me.com/memes_prog
🇬🇧Английский: www.tg-me.com/english_forprogrammers
🧠ИИ: www.tg-me.com/vistehno
🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
📕Ит-книги бесплатно: https://www.tg-me.com/addlist/BkskQciUW_FhNjEy
🚀 Silk.NET 3.0: грядущая революция в .NET-графике
Сообщество Silk.NET анонсировало работу над третьей версией своего фреймворка — амбициозным переосмыслением того, как должны работать низкоуровневые .NET-биндинги для графики и мультимедиа.
Особенность проекта всегда заключалась в кроссплатформенности и минимальных накладных расходах при работе с GPU. В 3.0 разработчики обещают переработанную систему биндингов и улучшенную интеграцию с современными .NET-стэками.
🤖 GitHub
@csharp_ci
Сообщество Silk.NET анонсировало работу над третьей версией своего фреймворка — амбициозным переосмыслением того, как должны работать низкоуровневые .NET-биндинги для графики и мультимедиа.
Особенность проекта всегда заключалась в кроссплатформенности и минимальных накладных расходах при работе с GPU. В 3.0 разработчики обещают переработанную систему биндингов и улучшенную интеграцию с современными .NET-стэками.
🤖 GitHub
@csharp_ci
🚀 SuperSocket —высокопроизводительный фреймворк для сетевых приложений на .NET. В отличие от стандартных решений, он предлагает готовую инфраструктуру для работы с TCP, UDP и WebSocket, скрывая сложности низкоуровневых операций за простым API.
Проект имеет модульную архитектуру с поддержкой middleware и встроенной системой команд, что позволяет легко адаптировать его для разных сценариев. Интеграция с DI-контейнером .NET и кроссплатформенность делают данный инструмент универсальным выбором для современных приложений.
🤖 GitHub
@csharp_ci
Проект имеет модульную архитектуру с поддержкой middleware и встроенной системой команд, что позволяет легко адаптировать его для разных сценариев. Интеграция с DI-контейнером .NET и кроссплатформенность делают данный инструмент универсальным выбором для современных приложений.
🤖 GitHub
@csharp_ci